package com.mv.encode;

import java.io.BufferedInputStream;
import java.io.FileInputStream;

public class FileEncode {
	/**
    * 判断文本文件的字符集，文件开头三个字节表明编码格式。 
    * <a href="http://blog.163.com/wf_shunqiziran/blog/static/176307209201258102217810/">参考的博客地址</a>
    * 
    * @param path
    * @return
    * @throws Exception
    * @throws Exception
    */
   public static final String ENCODE_GBK = "GBK";
   public static final String ENCODE_UTF8 = "UTF-8";
   public static final String ENCODE_UTF16LE = "UTF-16LE";
   public static final String ENCODE_UTF16BE = "UTF-16BE";
   public static String getFileEncode(String path) {
       String charset = ENCODE_GBK;
       byte[] first3Bytes = new byte[3];
       try {
           boolean checked = false;
           BufferedInputStream bis = new BufferedInputStream(new FileInputStream(path));
           bis.mark(0); // 读者注： bis.mark(0);修改为 bis.mark(100);我用过这段代码，需要修改上面标出的地方。 
                       // Wagsn注：不过暂时使用正常，遂不改之
           int read = bis.read(first3Bytes, 0, 3);
           if (read == -1) {
               bis.close();
               return charset; // 文件编码为 ANSI
           } else if (first3Bytes[0] == (byte) 0xFF && first3Bytes[1] == (byte) 0xFE) {
               charset = ENCODE_UTF16LE; // 文件编码为 Unicode
               checked = true;
           } else if (first3Bytes[0] == (byte) 0xFE && first3Bytes[1] == (byte) 0xFF) {
               charset = ENCODE_UTF16BE; // 文件编码为 Unicode big endian
               checked = true;
           } else if (first3Bytes[0] == (byte) 0xEF && first3Bytes[1] == (byte) 0xBB
                   && first3Bytes[2] == (byte) 0xBF) {
               charset = ENCODE_UTF8; // 文件编码为 UTF-8
               checked = true;
           }
           bis.reset();
           if (!checked) {
               while ((read = bis.read()) != -1) {
                   if (read >= 0xF0)
                       break;
                   if (0x80 <= read && read <= 0xBF) // 单独出现BF以下的，也算是GBK
                       break;
                   if (0xC0 <= read && read <= 0xDF) {
                       read = bis.read();
                       if (0x80 <= read && read <= 0xBF) // 双字节 (0xC0 - 0xDF)
                           // (0x80 - 0xBF),也可能在GB编码内
                           continue;
                       else
                           break;
                   } else if (0xE0 <= read && read <= 0xEF) { // 也有可能出错，但是几率较小
                       read = bis.read();
                       if (0x80 <= read && read <= 0xBF) {
                           read = bis.read();
                           if (0x80 <= read && read <= 0xBF) {
                               charset = ENCODE_UTF8;
                               break;
                           } else
                               break;
                       } else
                           break;
                   }
               }
           }
           bis.close();
       } catch (Exception e) {
           e.printStackTrace();
       }
       System.out.println("--文件-> [" + path + "] 采用的字符集为: [" + charset + "]");
       return charset;
   }
}
